﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpDevService.h"
#include "GcmpApiDeclaration.h"
#include <string>
namespace gcmp
{
    /// 用于保存全局、静态字符串。保证相同内容的全局、静态字符串内存唯一。避免相同内容的字符串多次构造、拷贝。
    /// 另外，字符串比较，比较内容性能较差，在保证相同内容的全局、静态字符串内存唯一的情况，可以直接通过比较地址来判断字符串是否相同。
    class UniqueString
    {
    public:
        /// \brief 查找String。
        ///
        /// 一般用于全局或静态字符串，因为局部频繁调用Find会影响性能。
        /// \param content UTF8格式
        /// \param createIfNotFound 如果没有找到是否创建，默认为创建。     
        GCMP_DEV_SERVICE_EXPORT static const UniqueString* Find(const std::string& content, bool createIfNotFound = true);

        const std::string& GetContent() const { return m_content; }

    private:
        UniqueString(const std::string& content);

        std::string m_content;
    };

    /// \brief UniqueString的宽字符串版本
    ///
    /// 用于保存全局、静态字符串。保证相同内容的全局、静态字符串内存唯一。避免相同内容的字符串多次构造、拷贝。
    /// 另外，字符串比较，比较内容性能较差，在保证相同内容的全局、静态字符串内存唯一的情况，可以直接通过比较地址来判断字符串是否相同。
    class UniqueWString
    {
    public:
        /// \brief 查找UniqueWString
        ///
        /// 一般用于全局或静态字符串，因为局部频繁调用Find会影响性能。
        /// \param content 字符串。
        /// \param createIfNotFound 如果没有找到是否创建，默认为创建。      
        GCMP_DEV_SERVICE_EXPORT static const UniqueWString * Find(const std::wstring & content, bool createIfNotFound = true);

        const std::wstring & GetContent() const { return m_content; }

    private:
        UniqueWString(const std::wstring & content);

        std::wstring m_content;
    };
}
